/**
 * 自定义错误类
 * 用于统一处理不同类型的错误
 */

/**
 * 基础错误类
 * 所有自定义错误的基类
 */
class BaseError extends Error {
  /**
   * 构造函数
   * @param {string} message - 错误消息
   * @param {number} statusCode - HTTP状态码
   * @param {boolean} isOperational - 是否为可操作错误
   */
  constructor(message, statusCode = 500, isOperational = true) {
    super(message);
    this.name = this.constructor.name;
    this.statusCode = statusCode;
    this.isOperational = isOperational;
    
    // 捕获堆栈跟踪
    Error.captureStackTrace(this, this.constructor);
  }
}

/**
 * 400错误 - 请求错误
 */
class BadRequestError extends BaseError {
  constructor(message = '请求参数错误') {
    super(message, 400);
  }
}

/**
 * 401错误 - 未授权
 */
class UnauthorizedError extends BaseError {
  constructor(message = '未授权访问') {
    super(message, 401);
  }
}

/**
 * 403错误 - 禁止访问
 */
class ForbiddenError extends BaseError {
  constructor(message = '禁止访问') {
    super(message, 403);
  }
}

/**
 * 404错误 - 资源未找到
 */
class NotFoundError extends BaseError {
  constructor(message = '请求的资源不存在') {
    super(message, 404);
  }
}

/**
 * 409错误 - 资源冲突
 */
class ConflictError extends BaseError {
  constructor(message = '资源冲突') {
    super(message, 409);
  }
}

/**
 * 422错误 - 无法处理的实体
 */
class UnprocessableEntityError extends BaseError {
  constructor(message = '无法处理的实体') {
    super(message, 422);
  }
}

/**
 * 500错误 - 服务器内部错误
 */
class InternalServerError extends BaseError {
  constructor(message = '服务器内部错误') {
    super(message, 500, false);
  }
}

/**
 * 502错误 - 网关错误
 */
class BadGatewayError extends BaseError {
  constructor(message = '网关错误') {
    super(message, 502);
  }
}

/**
 * 503错误 - 服务不可用
 */
class ServiceUnavailableError extends BaseError {
  constructor(message = '服务暂时不可用') {
    super(message, 503);
  }
}

/**
 * 数据库错误
 */
class DatabaseError extends BaseError {
  /**
   * 构造函数
   * @param {string} message - 错误消息
   * @param {Error} originalError - 原始数据库错误
   */
  constructor(message = '数据库操作失败', originalError = null) {
    super(message, 500);
    this.originalError = originalError;
  }
}

/**
 * 验证错误
 */
class ValidationError extends BaseError {
  /**
   * 构造函数
   * @param {string} message - 错误消息
   * @param {Array} details - 详细的验证错误信息
   */
  constructor(message = '数据验证失败', details = []) {
    super(message, 400);
    this.details = details;
  }
}

/**
 * 文件上传错误
 */
class FileUploadError extends BaseError {
  /**
   * 构造函数
   * @param {string} message - 错误消息
   * @param {string} fileName - 文件名
   */
  constructor(message = '文件上传失败', fileName = '') {
    super(message, 400);
    this.fileName = fileName;
  }
}

/**
 * 导出所有错误类
 */
module.exports = {
  BaseError,
  BadRequestError,
  UnauthorizedError,
  ForbiddenError,
  NotFoundError,
  ConflictError,
  UnprocessableEntityError,
  InternalServerError,
  BadGatewayError,
  ServiceUnavailableError,
  DatabaseError,
  ValidationError,
  FileUploadError,
  
  /**
   * 创建错误实例
   * @param {string} errorType - 错误类型名称
   * @param {Object} options - 错误选项
   * @returns {BaseError} 错误实例
   */
  createError(errorType, options = {}) {
    const ErrorClass = module.exports[errorType];
    if (!ErrorClass || !(ErrorClass.prototype instanceof BaseError)) {
      return new InternalServerError('未知的错误类型');
    }
    
    return new ErrorClass(options.message, options.details);
  },
  
  /**
   * 判断是否为操作错误
   * @param {Error} error - 错误对象
   * @returns {boolean} 是否为操作错误
   */
  isOperationalError(error) {
    return error instanceof BaseError && error.isOperational;
  }
};